
#ifndef _WEBKIT_H_
#define _WEBKIT_H_

#include "WebPage.h"
#include "WebKitPort.h"
#include "WebKitCaller.h"
#include <boost/shared_ptr.hpp>

namespace SpiderWebKitClient {

#define WKMethodTypeDefault        0
#define WKMethodTypeStaticProtocol 1

/*
 * @classname WebKit
 * @classdesc 该类用于获取和初始化WebPage，不可多线程调用，多线程情况下需要多次创建
 */
class WebKit {
    public:

    /*
     * @class WebKit
     * @func WebKit(std::string method, bool isStatic = false, int type = WKMethodTypeDefault);
     * @desc WebKit构造函数
     * @parm method 根据type,method的内容需要是一个IP或者指定实例的Protocol
     * @parm isStatic 是否是静态(js not enable)webkit实例, 默认动态(js enable)
     * @parm type 定义获得WebKit实例连接的方式( WKMethodTypeDefault 默认方式, WKMethodTypeStaticProtocol 指定机器上的实例)
     */
    WebKit(std::string method, bool isStatic = false, int type = WKMethodTypeDefault);
    ~WebKit();

    /*
     * @class WebKit
     * @func bool isFailed();
     * @desc 是否初始化失败，在get,post或者构造之后调用
     * @return true 失败，false 没有失败  
     */
    bool isFailed();

    /*
     * @class WebKit
     * @func ResFilter filter();
     * @desc 获得资源过滤器
     * @return ResFilter
     */
    ResFilter filter();

    /*
     * @class WebKit
     * @func void setFilter(ResFilter filter);
     * @desc 设置资源过滤器，该过滤器将会应用与该WebKit所获得的所有webpage实例中，若不设置则为空
     * @parm filter ResFilter
     */
    void setFilter(ResFilter filter);

    /*
     * @class WebKit
     * @func long setCookies(std::list<Cookie> cookies, std::string url);
     * @desc 设置指定URL的cookies，由于cookie策略还不完善，暂时不建议使用
     * @parm cookies 要设置的cookie
     * @parm url 要设置的url
     * @return -1 设置失败
     */
    long setCookies(std::list<Cookie> cookies, std::string url);

    /*
     * @class WebKit
     * @func WebPage* get(std::string url, int level = 100, long timeMS = 0, long destroyTimeMS = -1);
     * @desc 用GET方法，从服务器获得一个WebPage实例
     * @parm url 页面url
     * @parm level 优先级别，当服务器任务较多有等待的任务时，该参数越大的请求将会越先执行，默认为 100
     * @parm timeMS 超时时间，指从任务开始时计时的超时时间，默认为 0
     * @parm destroyTimeMS 销毁超时时间，指当一个页面长时间没有被操作，超过一定时间该页面在服务器端的实例自动被销毁，服务器端默认３分钟销毁
     * @return 返回与服务端实例对应的WebPage
     */
    WebPage* get(std::string url, int level = 100, long timeMS = 0, long destroyTimeMS = -1);

    /*
     * @class WebKit
     * @func WebPage* get(int &error, std::string url, int level = 100, long timeMS = 0, long destroyTimeMS = -1);
     * @desc 用GET方法，从服务器获得一个WebPage实例
     * @parm error 返回错误码
     * @parm url 页面url
     * @parm level 优先级别，当服务器任务较多有等待的任务时，该参数越大的请求将会越先执行，默认为 100
     * @parm timeMS 超时时间，指从任务开始时计时的超时时间，默认为 0
     * @parm destroyTimeMS 销毁超时时间，指当一个页面长时间没有被操作，超过一定时间该页面在服务器端的实例自动被销毁，服务器端默认３分钟销毁
     * @return 返回与服务端实例对应的WebPage
     */
    WebPage* get(int &error, std::string url, int level = 100, long timeMS = 0, long destroyTimeMS = -1);

    /*
     * @class WebKit
     * @func WebPage* post(std::string url, std::string data, int level = 100, long timeMS = 0, long destroyTimeMS = -1);
     * @desc 用POST方法，从服务器获得一个WebPage实例
     * @parm url 页面url
     * @parm data post数据
     * @parm level 优先级别，当服务器任务较多有等待的任务时，该参数越大的请求将会越先执行，默认为 100
     * @parm timeMS 超时时间，指从任务开始时计时的超时时间，默认为 0
     * @parm destroyTimeMS 销毁超时时间，指当一个页面长时间没有被操作，超过一定时间该页面在服务器端的实例自动被销毁，服务器端默认３分钟销毁
     * @return 返回与服务端实例对应的WebPage
     */
    WebPage* post(std::string url, std::string data, int level = 100, long timeMS = 0, long destroyTimeMS = -1);

    /*
     * @class WebKit
     * @func WebPage* post(int &error, std::string url, std::string data, int level = 100, long timeMS = 0, long destroyTimeMS = -1);
     * @desc 用POST方法，从服务器获得一个WebPage实例
     * @parm error 返回错误码
     * @parm url 页面url
     * @parm data post数据
     * @parm level 优先级别，当服务器任务较多有等待的任务时，该参数越大的请求将会越先执行，默认为 100
     * @parm timeMS 超时时间，指从任务开始时计时的超时时间，默认为 0
     * @parm destroyTimeMS 销毁超时时间，指当一个页面长时间没有被操作，超过一定时间该页面在服务器端的实例自动被销毁，服务器端默认３分钟销毁
     * @return 返回与服务端实例对应的WebPage
     */
    WebPage* post(int &error, std::string url, std::string data, int level = 100, long timeMS = 0, long destroyTimeMS = -1);

    WebPage* getWebPage(std::string url, int level = 100, long timeMS = 0, long destroyTimeMS = -1);
    WebPage* getWebPage(int &error, std::string url, int level = 100, long timeMS = 0, long destroyTimeMS = -1);

    /*
     * @func long destoryWebPage(WebPage *page);
     * @desc 销毁指定WebPage
     * @parm page WebPage
     * @return -1 失败
     */
    long destoryWebPage(WebPage *page);

    private:
    void initCaller();
    void destroyAllPages();

    boost::shared_ptr<WebKitCaller> m_caller;
    std::list<WebPage*> m_pages;
    int m_type;
    std::string m_method;
    ResFilter m_resFilter;
    bool m_isStatic;
};
} // namespace SpiderWebKitClient

#endif
